
https://labuladong.online/algo/data-structure-basic/binary-tree-traverse-basic/
今天是學習的第 20 天,主要學習了二叉樹的遞歸遍歷(DFS):
二叉樹有兩種遍歷形式:

遞歸遍歷的程式碼模板:
// 基本的二叉樹節點
class TreeNode {
    constructor(val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}
// 二叉樹的遞歸遍歷框架
var traverse = function(root) {
    if (root === null) {
        return;
    }
    traverse(root.left);
    traverse(root.right);
}
traverse 函式就像一個在二叉樹結構上遊走的指針。
遍歷順序:
在 traverse 函式中不同位置寫程式碼,效果是不一樣的。
所謂的前中後序遍歷,指的是在二元樹遍歷框架的不同位置寫程式碼:
// 二叉樹的遍歷框架
var traverse = function(root) {
    if (root === null) {
        return;
    }
    // 前序位置
    traverse(root.left);
    // 中序位置
    traverse(root.right);
    // 後序位置
};
// 建立一棵滿二叉樹(高度為 3)
//        1
//      /   \
//     2     3
//    / \   / \
//   4   5 6   7
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(7);
traverse(root);
// 前序位置執行順序:1 -> 2 -> 4 -> 5 -> 3 -> 6 -> 7
// 中序位置執行順序:4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7
// 後序位置執行順序:4 -> 5 -> 2 -> 6 -> 7 -> 3 -> 1
| 遍歷方式 | 執行時機 | 
|---|---|
| 前序遍歷 | 剛進入節點時 | 
| 中序遍歷 | 左子樹遍歷完成後 | 
| 後序遍歷 | 左右子樹都遍歷完成後 |